/*
 * CombinedMethodTrim.java
 *
 * Created on 17 Март 2008 г., 21:25
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package trim.calc;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import trim.Trim;
import trim.TrimException;
import trim.common.inputdata.FormatOrder;
import trim.common.bp.BPException;
import trim.common.bp.BestPartition;
import trim.common.inputdata.InputData;
import trim.common.result.TrimResult;
import trim.common.sm.SMException;
import trim.common.sm.SimpleTrimSMData;
import trim.common.sm.TrimSimplex;
import trim.common.utils.Utils;

/**
 * Комбинированный метод решения ЗФР.
 *
 * @author Дмитрий
 */
public class CombinedMethodTrim extends Trim
{

  /** Creates a new instance of CombinedMethodTrim */
  public CombinedMethodTrim()
  {
  }

  @Override
  public TrimResult solve(InputData inputData) throws TrimException
  {
    try{
      InputData baseId=inputData;
      inputData=Utils.groupInputData(inputData).clone();
      TrimSimplex sm=new TrimSimplex(new SimpleTrimSMData(inputData));
      sm.solve();
      TrimResult tr=sm.getTrimResult();
      List<FormatOrder> rest=sm.getRestFormatCount();
      inputData.getFormatOrderList().clear();
      inputData.getFormatOrderList().addAll(rest);
      int lt=sm.getRestMaterials();
      tr.addAll(new BestPartition(inputData).solve(lt));
      return tr;
    }catch(BPException ex){
      throw new TrimException("Error in BP",ex);
    }catch(SMException ex){
      throw new TrimException("Error in SM",ex);
    }
  }

  @Override
  public String getName()
  {
    return this.getClass().getSimpleName();
  }

  @Override
  public String getVersion()
  {
    InputStream is=getClass().getResourceAsStream("/trim/calc/version");
    byte[] b=new byte[20];
    try{
      int n=is.read(b);
      return new String(b,0,n);
    }catch(IOException ex){
      ex.printStackTrace();
      return "0";
    }
  }

  @Override
  public String getDescription()
  {
    return "Комбинированный алгоритм решения ЗФР";
  }
}
